#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
#include "misc.h"
#include "common.h"
#include "key.h"
#include "delay.h"

void key_exti_init(void)
{
	EXTI_InitTypeDef key_exti;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开AFIO时钟

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12); //选择作为EXTI线的GPIO引脚
	key_exti.EXTI_Line = EXTI_Line12;							 //pc12
	key_exti.EXTI_Mode = EXTI_Mode_Interrupt;
	key_exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //EXTI_Trigger_Rising;
	key_exti.EXTI_LineCmd = ENABLE;

	EXTI_Init(&key_exti);
}

void key_nvic_init(void)
{
	NVIC_InitTypeDef key_nvic;

	key_nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
	key_nvic.NVIC_IRQChannelSubPriority = 0;
	key_nvic.NVIC_IRQChannelPreemptionPriority = 1;
	key_nvic.NVIC_IRQChannelCmd = ENABLE;

	NVIC_Init(&key_nvic);
}

/*
PB12,key高电平有效
当按键不被按下的时候，希望他一直稳定在低电平--下拉
*/
void key_init(KEY_NAME key, MODE mode)
{
	GPIO_InitTypeDef key_gpio;

	switch (key)
	{
	case KEY1:
		//打开RCC时钟，GPIOB
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
		//给GPIO初始化结构体赋值
		key_gpio.GPIO_Pin = GPIO_Pin_12;
		key_gpio.GPIO_Mode = GPIO_Mode_IPD;
		//初始化
		GPIO_Init(GPIOB, &key_gpio);
		break;

	case KEY2:
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		key_gpio.GPIO_Pin = GPIO_Pin_6;
		key_gpio.GPIO_Mode = GPIO_Mode_IPD;
		GPIO_Init(GPIOA, &key_gpio);
		break;
	}

	if (INTERRUPT == mode)
	{
		key_exti_init();
		key_nvic_init();
	}
}

/*
花式按键:
	一个按键：
		判断长按和短按
		判断按的次数	
*/
u8 key_read(void)
{

#if 0
	while(PRESS == GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12))
	{
		if(UNPRESS == GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12))
		{
			break;
		}
	}
#elif 0
	u8 result = 0;
	delay_us(10); //按键去抖
	result = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);
	if (result == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
#else
	if (1 == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12))
	{
		delay_us(10); //按键去抖
		if (1 == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12))
		{
			return PRESS;
		}
	}
	else
	{
		return UNPRESS;
	}

#endif
}

//全局变量
//中断服务函数，多线程
u8 key_int_flag = 0;

void EXTI15_10_IRQHandler(void)
{
	if (SET == EXTI_GetITStatus(EXTI_Line12))
	{
		//.....
		//不要写循环，不要有延时，不能被阻塞
		delay_ms(100);
		if (key_int_flag)
		{
			key_int_flag = 0;
		}
		else
		{
			key_int_flag++;
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line12);
}
